package main

import (
	"context"
	"fmt"
	"time"
)

type test01 string
type test02 string

func context01(ctx context.Context) {
	ctx01 := context.WithValue(ctx, test01("test01_key"), "test01_val")
	context02(ctx01)
}
func context02(ctx context.Context) {
	ctx02 := context.WithValue(ctx, test02("test02_key"), "test02_val")
	context03(ctx02)
}
func context03(ctx context.Context) {
	val := ctx.Value(test01("test01_key"))
	fmt.Println(val)
	val3 := ctx.Value("ete")
	fmt.Println(val3)
}
func process(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("main goroutine done")
			return
		default:
			fmt.Println("do some work....")
			time.Sleep(time.Second)
		}
	}
}
func main() {
	t0 := time.Now()
	ctx1, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000) // 1000毫秒超时
	t1 := time.Now()
	fmt.Println(t1.Sub(t0).Milliseconds())
	defer cancel()
	time.Sleep(time.Millisecond * 500)                          //睡眠500毫秒，cxt1 还剩下 500毫秒
	ctx2, _ := context.WithTimeout(ctx1, time.Millisecond*1000) // ctx2 1000毫秒超时，因为 1000毫秒 > ctx1剩下的500毫秒，所以以500毫秒为准
	t2 := time.Now()
	select {
	case <-ctx2.Done():
		fmt.Println(ctx2.Err())
		fmt.Printf("now - t1 = %d\n", time.Now().Sub(t1).Milliseconds())
		fmt.Printf("now - t2= %d \n", time.Now().Sub(t2).Milliseconds()) // 这里是 -500毫秒
	}
}

func doSome(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("err:", ctx.Err())
			return
		default:
			fmt.Println("default")
			time.Sleep(time.Second)

		}
	}
}
